# -*- coding: utf-8 -*-

"""
Date: 2023/2/7 16:32
Author: Darker
"""

import pathlib
import sys
from typing import Union, Text
import attr

import munch

from Utils.exception import DarkerFormatError


@attr.s(auto_attribs=True)
class Config(object):
    __rootPath = pathlib.Path(__file__).parent.parent

    @property
    def configPath(self) -> pathlib.Path:
        """配置文件目录路径"""
        return self.__rootPath.joinpath("Config")

    @property
    def dataPath(self) -> pathlib.Path:
        """数据文件目录路径"""
        return self.__rootPath.joinpath("Data")

    @property
    def imagePath(self) -> pathlib.Path:
        """影像文件目录路径"""
        return self.__rootPath.joinpath("Image")

    @property
    def logPath(self) -> pathlib.Path:
        """日志文件目录路径"""
        return self.__rootPath.joinpath("Log")

    @property
    def reportPath(self) -> pathlib.Path:
        """测试报告文件目录路径"""
        return self.__rootPath.joinpath("Report")

    @staticmethod
    def __load(filePath: Union[Text, pathlib.Path]) -> munch.Munch:
        """加载文件内容"""
        if isinstance(filePath, Text):
            filePath = pathlib.Path(filePath)
        filePathSuffix = filePath.suffix
        with open(filePath, "r", encoding=sys.getdefaultencoding()) as fileReader:
            match filePathSuffix:
                case ".json":
                    result = munch.fromJSON(munch.Munch, fileReader.read())
                case ".yaml" | ".yml":
                    result = munch.fromYAML(munch.Munch, fileReader)
                case _:
                    raise DarkerFormatError("文件格式不正确，目前只支持json和yaml")
        return result

    def load_config(self, fileName: Text, *args) -> munch.Munch:
        """
        加载配置文件
        :param fileName: 文件名(包含后缀)
        :param args: 如果配置文件不在Config目录下，则需要传入该文件的父级目录
            example:
                假如a配置文件的路径是：.../Config/test01/test02/a.yaml
                那么该参数需要传入：test01, test02 或者 test01/test02
        """
        filePath = self.configPath.joinpath(*args, fileName)
        return self.__load(filePath)

    def load_data(self, fileName: Text, *args) -> munch.Munch:
        """
        加载数据文件
        :param fileName: 文件名(包含后缀)
        :param args: 同load_config方法
        """
        filePath = self.dataPath.joinpath(*args, fileName)
        return self.__load(filePath)
